#pragma once
#include <iostream>
#include <string>
#include <functional>
#include <pthread.h>
#include "Semaphore/ringQueue.hpp" //引入基于互斥锁+信号量+循环队列的生产者消费者模型

using namespace std;

typedef void *(*func_t)(void *);

class ThreadData // 线程传参数据的结构
{
public:
    void *_args;
    string _name;
    pthread_t tid;
    void *_tp;
};

class Thread
{
public:
    Thread(int num, func_t routine, void *args) // 线程编号
    {
        td._name = "thread " + to_string(num);
        td._args = args;
        _routine = routine;
    }
    void start()
    {
        pthread_create(&td.tid, NULL, _routine, (void *)&td); // 启动线程，进入回调函数
    }
    void join()
    {
        pthread_join(td.tid, NULL); // 等待线程退出
    }
    string name() { return td._name; } // 获取线程名
    ~Thread() {}

    void getTPool(void *tp)
    {
        td._tp = tp; // 将任务队列传给线程，使线程能够拿去任务
    }

private:
    func_t _routine; // 线程启动后执行的回调函数
    ThreadData td;
};